/**
 * Esta clase modela la entidad Mrouter. Esta entidad se encarga de comprobar si
 * la maquina actual esta ocupada u ociosa y actua en consecuencia aceptando el
 * trabajo o psandolo a la siguiente maquina.
 *
 */
package factory;

import eduni.simanim.*;
import eduni.simjava.*;

/**
 *
 * @author eagle
 */
//Machine Router
public class Mrouter extends Sim_entity {

    private Sim_port machine, next, in;
    private int state;
    private static final int FORWARD = 0;
    private static final int COLLECT = 1;
    //Objeto para los calculos estdisticos
    private Sim_stat stat;

    /**
     *
     * @param name nombre d ela entidad
     * @param x coordenada en x
     * @param y coordenada en y
     */
    public Mrouter(String name, int x, int y) {
        super(name, "mrouter", x, y);
        machine = new Sim_port("machine", "port", Anim_port.BOTTOM, 10);
        add_port(machine);
        next = new Sim_port("next", "port", Anim_port.RIGHT, 10);
        add_port(next);
        in = new Sim_port("in", "port", Anim_port.LEFT, 10);
        add_port(in);
        state = COLLECT;
        add_param(new Anim_param("State", Anim_param.STATE, "collect"));

        stat = new Sim_stat();
        stat.add_measure(Sim_stat.THROUGHPUT);
        stat.add_measure(Sim_stat.RESIDENCE_TIME);
        stat.add_measure(Sim_stat.UTILISATION);
        set_stat(stat);
    }

    @Override
    public void body() {
        Sim_event ev = new Sim_event();
        while (Sim_system.running()) {
            // sim_get_next: obtiene el primer evento de la cola de espera.
            sim_get_next(ev);
            sim_hold(0.01);
            if (ev.get_tag() == 1) {
                if (state == COLLECT) {
                    sim_schedule(machine, 0.0, 1);
                    if (AppletFactory.show_msg) {
                        sim_trace(1, "S machine J");
                    }
                    state = FORWARD;
                    dump_state();
                } else {
                    sim_schedule(next, 0.0, 1);
                    if (AppletFactory.show_msg) {
                        sim_trace(1, "S next J");
                    }
                }
            } else {
                state = COLLECT;
                dump_state();
            }
        }
    }

    /**
     * Este metodo produce una traza segun sea que el trabajo se vaya a la cola
     * o se vaya a la siguiente maquina.
     */
    public void dump_state() {
        if (state == FORWARD) {
            sim_trace(1, "P forward");
        }
        if (state == COLLECT) {
            sim_trace(1, "P collect");
        }
    }
}